package towers;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Point2D;

import javax.swing.ImageIcon;

import projectiles.Cannonball;
import projectiles.Projectile;

public class Cannon extends Tower {

	// Het lijstje gegevens
	private static final int maxHealth = 250;
	private static int health = maxHealth;
	private static final int range = 500;
	private static final int firerate = 250;
	
	public static final int cost = 100;
	private static final ImageIcon image = new ImageIcon("images/cannon.gif");
	private static final Dimension size = new Dimension( Cannon.image.getIconWidth(), Cannon.image.getIconHeight() );
	
	// Image2 is de onderkant van de toren, deze hoeft niet te draaien
	private static final ImageIcon image2 = new ImageIcon("images/cannonbase.gif");
	
	/**
	 *  Constructor
	 * @param position De positie van de cannon meegeven
	 */
	public Cannon( Point2D.Double position ) {
		super(position, health, Cannon.image, size, 0, range, firerate, cost);
	}

	
	/**
	 *  Zorgt ervoor dat een projectiel afgeschoten word op de vijand waar op het moment
	 *  op gericht word
	 */
	/**
	 *  Zorgt ervoor dat een projectiel afgeschoten word op de vijand waar op het moment
	 *  op gericht word
	 */
	public Projectile shoot(){
		updateFirerate();

		Point2D.Double middle = this.getMiddle();
		
		// Pas positie aan waar de Cannonball moet verschijnen aan de hand van de viewangle 
		double xAdd;
		double yAdd;
		
		double distanceToBottom = getSize().getHeight() / 2;
		
		
		//we kijken naar linksonder
		if( viewAngle >= 0 && viewAngle < 90 ){
			xAdd = -1 * ( Math.sin( Math.toRadians( viewAngle ) ) ) * distanceToBottom;
			yAdd = ( Math.cos( Math.toRadians( viewAngle ) ) )* distanceToBottom ;
		} // we kijken naar linksboven
		else if( viewAngle >= 90 && viewAngle < 180 ){
			xAdd = -1 * Math.sin( Math.toRadians( viewAngle ) ) * distanceToBottom ;
			yAdd = Math.cos( Math.toRadians( viewAngle ) ) * distanceToBottom ;
		} // we kijken naar rechtsboven
		else if( viewAngle >= 180 && viewAngle < 270 ){
			xAdd = -1 * Math.sin( Math.toRadians( viewAngle ) ) * distanceToBottom ;
			yAdd = Math.cos( Math.toRadians( viewAngle ) ) * distanceToBottom ;
		} // we kijken naar rechtsonder
		else{
			xAdd = -1  * Math.sin( Math.toRadians( viewAngle ) ) * distanceToBottom ;
			yAdd = Math.cos( Math.toRadians( viewAngle ) ) * distanceToBottom ;
		}
		
		middle.x += xAdd;
		middle.y += yAdd;
		
		Cannonball x = new Cannonball( this, middle, viewAngle, this.getForesideEnemy()  );
		
		// Positie van plasmaball is linksboven van plaatje
		// Echter positie van middle moet het midden zijn van plasmaball, dus positie aanpassen
		x.setPosition( new Point2D.Double( x.getPosition().x - ( x.getSize().getWidth() / 2 ), x.getPosition().y - ( x.getSize().getHeight() / 2 )) );
		return x;
	}
	
	
	/**
	 * Zorgt er vooral voor dat een toren op een enemy richt, en zijn viewangle update
	 * zodat de toren naar de enemy gaat kijken
	 */
	public boolean update(){
		super.update();
		
		return this.aimAtEnemy();
	}
	
	/**
	 * Zorgt ervoor dat eerst de ondergrond getekend, roept daarna de super aan om het cannon op
	 * zich te tekenen
	 */
	public void draw(Graphics g, Rectangle area, Component c )
	{
		Graphics2D g2d = (Graphics2D)g;
		g2d.drawImage( Cannon.image2.getImage(), (int)this.position.x, (int)this.position.y, c );
		super.draw(g, area, c);

	}
}